#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const { PDFDocument } = require('pdf-lib');
const readlineSync = require('readline-sync');

// 设置控制台编码为UTF-8，解决中文路径问题
if (process.platform === 'win32') {
    try {
        // 尝试设置控制台代码页为UTF-8
        require('child_process').execSync('chcp 65001', { stdio: 'ignore' });
    } catch (error) {
        // 如果设置失败，忽略错误
    }
}

class PDFSlicer {
    constructor() {
        this.inputPath = '';
        this.outputPath = '';
        this.startPage = 0;
        this.endPage = 0;
        this.totalPages = 0;
    }

    // 处理文件路径，解决中文编码问题
    normalizePath(inputPath) {
        // 移除首尾引号
        let normalizedPath = inputPath.replace(/^["']|["']$/g, '');
        
        // 在Windows上，尝试不同的编码方式处理中文路径
        if (process.platform === 'win32') {
            try {
                // 尝试使用GBK编码解码
                const iconv = require('iconv-lite');
                const buffer = Buffer.from(normalizedPath, 'binary');
                const decoded = iconv.decode(buffer, 'gbk');
                if (decoded && fs.existsSync(decoded)) {
                    return decoded;
                }
            } catch (error) {
                // 如果iconv-lite不可用，继续使用原路径
            }
        }
        
        return normalizedPath;
    }

    // 显示欢迎信息
    showWelcome() {
        console.log('\n=== PDF 切割工具 ===');
        console.log('欢迎使用PDF切割程序！');
        console.log('本程序可以帮助您从PDF文档中提取指定页面范围的页面。\n');
    }

    // 获取用户输入的文件路径
    async getInputPath() {
        while (true) {
            const rawInput = readlineSync.question('请输入PDF文件路径: ').trim();
            
            // 使用路径标准化函数处理中文编码问题
            this.inputPath = this.normalizePath(rawInput);
            
            // 处理相对路径和绝对路径
            if (!path.isAbsolute(this.inputPath)) {
                this.inputPath = path.resolve(process.cwd(), this.inputPath);
            }

            // 调试信息：显示处理后的路径
            console.log(`🔍 检查文件路径: ${this.inputPath}`);

            if (!fs.existsSync(this.inputPath)) {
                console.log('❌ 文件不存在，请重新输入！');
                console.log('💡 提示：请确保路径正确，可以尝试：');
                console.log('   - 使用双引号包围包含空格的路径');
                console.log('   - 使用正斜杠 / 代替反斜杠 \\');
                console.log('   - 检查文件名是否包含特殊字符');
                console.log('   - 尝试将文件复制到英文路径下');
                continue;
            }

            if (path.extname(this.inputPath).toLowerCase() !== '.pdf') {
                console.log('❌ 文件不是PDF格式，请重新输入！');
                continue;
            }

            try {
                // 验证PDF文件并获取总页数
                const pdfBytes = fs.readFileSync(this.inputPath);
                const pdfDoc = await PDFDocument.load(pdfBytes);
                this.totalPages = pdfDoc.getPageCount();
                
                console.log(`✅ 文件加载成功！PDF总页数: ${this.totalPages}`);
                break;
            } catch (error) {
                console.log('❌ PDF文件损坏或无法读取，请重新输入！');
                console.log('错误信息:', error.message);
            }
        }
    }

    // 获取页面范围
    getPageRange() {
        console.log(`\nPDF总页数: ${this.totalPages}`);
        console.log('页面编号从 1 开始');
        
        while (true) {
            const startInput = readlineSync.question(`请输入起始页面 (1-${this.totalPages}): `).trim();
            const startPage = parseInt(startInput);
            
            if (isNaN(startPage) || startPage < 1 || startPage > this.totalPages) {
                console.log(`❌ 请输入有效的起始页面 (1-${this.totalPages})`);
                continue;
            }

            const endInput = readlineSync.question(`请输入结束页面 (${startPage}-${this.totalPages}): `).trim();
            const endPage = parseInt(endInput);
            
            if (isNaN(endPage) || endPage < startPage || endPage > this.totalPages) {
                console.log(`❌ 请输入有效的结束页面 (${startPage}-${this.totalPages})`);
                continue;
            }

            this.startPage = startPage;
            this.endPage = endPage;
            break;
        }
    }

    // 获取输出文件路径
    getOutputPath() {
        const inputDir = path.dirname(this.inputPath);
        const inputName = path.basename(this.inputPath, '.pdf');
        const defaultName = `${inputName}_pages_${this.startPage}-${this.endPage}.pdf`;
        const defaultPath = path.join(inputDir, defaultName);

        const userInput = readlineSync.question(`请输入输出文件路径 (回车使用默认: ${defaultName}): `).trim();
        
        if (userInput === '') {
            this.outputPath = defaultPath;
        } else {
            // 使用路径标准化函数处理中文编码问题
            this.outputPath = this.normalizePath(userInput);
            
            if (!path.isAbsolute(this.outputPath)) {
                this.outputPath = path.resolve(process.cwd(), this.outputPath);
            }
            // 确保输出文件有.pdf扩展名
            if (path.extname(this.outputPath).toLowerCase() !== '.pdf') {
                this.outputPath += '.pdf';
            }
        }
    }

    // 执行PDF切割
    async slicePDF() {
        try {
            console.log('\n🔄 正在处理PDF文件...');
            
            // 读取原始PDF
            const pdfBytes = fs.readFileSync(this.inputPath);
            const originalPdf = await PDFDocument.load(pdfBytes);
            
            // 创建新的PDF文档
            const newPdf = await PDFDocument.create();
            
            // 复制指定页面范围
            const pages = await newPdf.copyPages(originalPdf, 
                Array.from({length: this.endPage - this.startPage + 1}, (_, i) => this.startPage - 1 + i)
            );
            
            // 将页面添加到新文档
            pages.forEach(page => newPdf.addPage(page));
            
            // 保存新PDF
            const pdfBytesNew = await newPdf.save();
            fs.writeFileSync(this.outputPath, pdfBytesNew);
            
            console.log('✅ PDF切割完成！');
            console.log(`📄 输出文件: ${this.outputPath}`);
            console.log(`📊 提取页面: ${this.startPage}-${this.endPage} (共${this.endPage - this.startPage + 1}页)`);
            
        } catch (error) {
            console.log('❌ PDF切割失败！');
            console.log('错误信息:', error.message);
            throw error;
        }
    }

    // 显示操作信息
    showOperationInfo() {
        console.log('\n=== 操作信息 ===');
        console.log(`输入文件: ${this.inputPath}`);
        console.log(`输出文件: ${this.outputPath}`);
        console.log(`页面范围: ${this.startPage}-${this.endPage} (共${this.endPage - this.startPage + 1}页)`);
    }

    // 主运行方法
    async run() {
        try {
            this.showWelcome();
            await this.getInputPath();
            this.getPageRange();
            this.getOutputPath();
            this.showOperationInfo();
            await this.slicePDF();
            
        } catch (error) {
            console.log('\n❌ 程序执行出错:', error.message);
        }
    }
}

// 运行程序
if (require.main === module) {
    const slicer = new PDFSlicer();
    slicer.run();
}

module.exports = PDFSlicer;
